//using System;
//using System.Collections.Generic;
//using System.Text;

//

//namespace SqlToolkit.Oracle
//{
//    public class SqlDbJoinedObject
//    {
//        public enum Direction
//        {
//            INNER,
//            OUTER,
//            RIGHT,
//            LEFT
//        }

//        SqlDbTableCollection _tables = null;
//        SqlDbTableFieldCollection _selCols = null;
//        SqlDbTableFieldCollection _leftCols = null;
//        SqlDbTableFieldCollection _rightCols = null;
//        SqlDbTableFieldCollection _orderCols = null;
//        Direction[] _joinDir = null;
//        FilterOperatorType[] _joinOps = null;
//        QueryFilterList _filters = null;

//        public SqlDbJoinedObject(SqlDbTable root)
//        {
//            if (null == root) { throw new Exception("Invalid paramater passed to SqlDbJoinedObject constructor."); }

//            Tables.Add(root);
//        }


//        public SqlDbTableCollection Tables
//        {
//            get 
//            {
//                if (null == _tables) { _tables = new SqlDbTableCollection(); }

//                return _tables;
//            }
//        }

//        public SqlDbTableFieldCollection SelectColumns
//        {
//            get
//            {
//                if (null == _selCols) { _selCols = new SqlDbTableFieldCollection(); }

//                return _selCols;
//            }
//        }

//        public SqlDbTableFieldCollection OrderByColumns
//        {
//            get
//            {
//                if (null == _orderCols) { _orderCols = new SqlDbTableFieldCollection(); }

//                return _orderCols;
//            }
//        }

//        public SqlDbTableFieldCollection LeftColumns
//        {
//            get
//            {
//                if (null == _leftCols) { _leftCols = new SqlDbTableFieldCollection(); }

//                return _leftCols;
//            }
//        }

//        public SqlDbTableFieldCollection RightColumns
//        {
//            get
//            {
//                if (null == _rightCols) { _rightCols = new SqlDbTableFieldCollection(); }

//                return _rightCols;
//            }
//        }

//        public Direction[] JoinDirections
//        {
//            get
//            {
//                if (null == _joinDir) { _joinDir = new Direction[] { }; }

//                return _joinDir;
//            }
//        }

//        internal void Add(Direction direction)
//        {   //some what costly operation
//            Direction[] tmp = new Direction[JoinDirections.Length + 1];

//            JoinDirections.CopyTo(tmp,0);
//            tmp[tmp.Length] = direction;

//            _joinDir = tmp;
//        }

//        internal void Add(FilterOperatorType op)
//        {   //some what costly operation
//            FilterOperatorType[] tmp = new FilterOperatorType[JoinOperators.Length + 1];

//            JoinOperators.CopyTo(tmp,0);
//            tmp[tmp.Length] = op;

//            _joinOps = tmp;
//        }

//        public void Add(SqlDbTable table, SqlDbTableField left, SqlDbTableField right, Direction dir, FilterOperatorType op)
//        {
//            if (null == table || null == left || null == right) { throw new Exception("SqlDbJoinedObject.Add(SqlDbTable table, SqlDbTableField left, SqlDbTableField right, Direction dir, FilterOperatorType op) -> No parameter may be null."); }

//            Tables.Add(table);
//            LeftColumns.Add(left);
//            RightColumns.Add(right);
//            Add(dir);
//            Add(op);
//        }

//        public FilterOperatorType[] JoinOperators
//        {
//            get
//            {
//                if (null == _joinOps) { _joinOps = new FilterOperatorType[] { }; }

//                return _joinOps;
//            }
//        }

//        public QueryFilterList CheckClause
//        {
//            get
//            {
//                if (null == _filters) { _filters = new QueryFilterList(); }

//                return _filters;
//            }
//        }

//        public string Sql()
//        {
//            StringBuilder sb = new StringBuilder();

//            if (Tables.Count > 1 && Tables.Count == (LeftColumns.Count - 1) && Tables.Count == (RightColumns.Count - 1) && Tables.Count == (JoinDirections.Length - 1) && Tables.Count == (JoinOperators.Length - 1))
//            {
//                sb.Append("SELECT ");

//                for(int i = 0; i < SelectColumns.Count; i++)
//                {
//                    if (i < (SelectColumns.Count - 1))
//                    {
//                        sb.Append(SelectColumns[i].TableName + "." + SelectColumns[i].ColumnName + ",");
//                    }
//                    else
//                    {
//                        sb.Append(SelectColumns[i].TableName + "." + SelectColumns[i].ColumnName);
//                    }
//                }

//                sb.Append(" FROM");
//                sb.Append(" " + JoinString());
//                sb.Append(" " + WhereString());
//                sb.Append(" " + OrderByString());
//            }
//            else
//            {
//                throw new Exception("Invalid join object.");
//            }

//            return sb.ToString().Trim();
//        }

//        internal string JoinString()
//        {
//            StringBuilder sb = new StringBuilder();

//            if (Tables.Count > 1 && Tables.Count == (LeftColumns.Count - 1) && Tables.Count == (RightColumns.Count - 1) && Tables.Count == (JoinDirections.Length - 1) && Tables.Count == (JoinOperators.Length - 1))
//            {
//                //i'm going to have to write this code one day....
//            }
//            else
//            {
//                throw new Exception("Invalid join object.");
//            }

//            return sb.ToString();
//        }

//        internal string WhereString()
//        {

//            if (Tables.Count > 1 && Tables.Count == (LeftColumns.Count - 1) && Tables.Count == (RightColumns.Count - 1) && Tables.Count == (JoinDirections.Length - 1) && Tables.Count == (JoinOperators.Length - 1))
//            {
//                string check = CheckClause.GetCheckClause();
//                if (check.Length > 0) { return "WHERE " + check; }
//            }
//            else
//            {
//                throw new Exception("Invalid join object.");
//            }

//            return "";
//        }
//        internal string OrderByString()
//        {
//            StringBuilder ret = new StringBuilder();

//            if (OrderByColumns.Count > 0)
//            {
//                ret.Append("ORDER BY");

//                for (int i = 0; i < OrderByColumns.Count; i++)
//                {
//                    if (i < (OrderByColumns.Count - 1))
//                    {
//                        ret.Append(" " + OrderByColumns[i].TableName + "." + OrderByColumns[i].ColumnName + ",");
//                    }
//                    else
//                    {
//                        ret.Append(" " + OrderByColumns[i].TableName + "." + OrderByColumns[i].ColumnName);
//                    }
//                }
//            }

//            return ret.ToString();
//        }
//    }
//}
